const ObjectGetSetUtils = {
    /**
     * // 示例用法
     * const a = { test: 1 };
     * console.log(getFieldValue(a, 'test')); // 输出: 1
     *
     * const b = { user: { name: 'John Doe', age: 30 } };
     * console.log(getFieldValue(b, 'user.name')); // 输出: John Doe
     *
     * const c = [1, 2, 3];
     * console.log(getFieldValue(c, '[1]')); // 输出: 2
     *
     * const d = { nested: [{ inner: 'A' }, { inner: 'B' }] };
     * console.log(getFieldValue(d, 'nested[1].inner')); // 输出: B
     *
     * const e = [{ id: 1, name: 'Alice' }, { id: 2, name: 'Bob' }];
     * console.log(getFieldValue(e, '[1].name')); // 输出: Bob
     * @param data {object|Array}
     * @param field {string}
     * @return {undefined|*}
     */
    getFieldValue(data, field) {
        // 检查是否提供了有效的数据和字段
        if (data == null || typeof field !== 'string') {
            return undefined;
        }

        // 使用正则表达式匹配属性名或数组索引
        const parts = field.match(/(\w+)|\[(\d+)\]/g);

        // 遍历parts数组，逐步深入对象或数组获取值
        let value = data;
        for (let part of parts) {
            let key = part.replace(/\[|\]/g, ''); // 去除方括号
            if (value !== null && typeof value === 'object' && key in value) {
                value = value[key];
            } else {
                // 如果在任何一步中找不到键，则返回undefined
                return undefined;
            }
        }

        // 返回最终找到的值
        return value;
    },
    /**
     * // 示例用法
     * const a = { test: 1 };
     * setFieldValue(a, 'test', 2);
     * console.log(a); // 输出: { test: 2 }
     *
     * const b = { user: { name: 'John Doe', age: 30 } };
     * setFieldValue(b, 'user.name', 'Jane Doe');
     * console.log(b); // 输出: { user: { name: 'Jane Doe', age: 30 } }
     *
     * const c = [1, 2, 3];
     * setFieldValue(c, '[1]', 4);
     * console.log(c); // 输出: [1, 4, 3]
     *
     * const d = { nested: [{ inner: 'A' }, { inner: 'B' }] };
     * setFieldValue(d, 'nested[1].inner', 'C');
     * console.log(d); // 输出: { nested: [{ inner: 'A' }, { inner: 'C' }] }
     *
     * const e = [{ id: 1, name: 'Alice' }, { id: 2, name: 'Bob' }];
     * setFieldValue(e, '[1].name', 'Charlie');
     * console.log(e); // 输出: [{ id: 1, name: 'Alice' }, { id: 2, name: 'Charlie' }]
     * @param obj {object|Array}
     * @param field {string}
     * @param value {*}
     * @param vue {boolean}
     */
    setFieldValue(obj, field, value,vue=false) {
        // 检查是否提供了有效的对象、字段和值
        if (obj == null || typeof field !== 'string') {
            return;
        }
        // 使用正则表达式匹配属性名或数组索引
        const parts = field.match(/(\w+)|\[(\d+)\]/g);
        // 用于存储当前遍历到的对象或数组
        let current = obj;
        // 遍历parts数组，逐步深入对象或数组
        for (let i = 0; i < parts.length - 1; i++) {
            let key = parts[i].replace(/\[|\]/g, ''); // 去除方括号

            // 如果当前路径不存在，则创建它
            if (!(key in current)) {
                if (parts[i + 1].includes('[')) {
                    // 下一个部分是数组索引，当前部分应该是数组
                    current[key] = [];
                } else {
                    // 下一个部分是属性名，当前部分应该是对象
                    current[key] = {};
                }
            }
            // 更新current为下一个层级
            current = current[key];
        }
        // 设置最后一个部分的值，使用Vue.set确保响应式
        let lastKey = parts[parts.length - 1].replace(/\[|\]/g, '');
        if(vue) {
            Vue.set(current, lastKey, value);
        } else {
            current[lastKey] = value;
        }
    }
}

export default ObjectGetSetUtils
